package com.tensai.study.基础.线程;

/**
 * Created by 63289 on 2017/3/31.
 */
class MyThread extends Thread {
    private boolean isRunning = true;

    public boolean isRunning() {
        return isRunning;
    }

    public void setRunning(boolean isRunning) {
        this.isRunning = isRunning;
    }

    @Override
    public void run() {
        System.out.println("进入到run方法中了");
        while (isRunning()) {
        }
        System.out.println("线程执行完成了");
    }
}

/**
 * 在这个例子中，主线程启动了子线程，子线程成功进入run方法，输出”进入到run方法中”，只有由于isRunning==true，无限循环。此时，sleep一秒后的主线程想要改变isRunning的值，它将isRunning变量读取到它的内存空间进行修改后，写入主内存，但由于子线程一直在私有栈中读取isRunning变量，没有在主内存中读取isRunning变量，因此不会退出循环。
 * <p>
 * 如果我们把isRunning赋值行改为：
 * <p>
 * private volatile boolean isRunning = true;
 * 将其用volatile修饰，则强制该变量从主内存中读取。
 * <p>
 * 这样我们也就明白了volatile的实现机理，即：
 * <p>
 * 当一个线程要使用volatile变量时，它会直接从主内存中读取，而不使用自己工作内存中的副本。
 * <p>
 * 当一个线程对一个volatile变量写时，它会将变量的值刷新到共享内存(主内存)中。
 */
public class RunThread {
    public static void main(String[] args) {
        try {
            MyThread thread = new MyThread();
            thread.start();
            Thread.sleep(1000);
            thread.setRunning(false);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
